package gestoremulte.pack;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
/*
 * Questa Activity prende i dati riguardanti la via e il comune e si seleziona l'infrazione/i
 */
public class MultaActivity extends Activity {
	
	public static final int GET_IMAGE = 2;
	private TextView tv;
	private double lat = 1000;
	private double longi = 1000;
	private boolean gpsVerify = false;
	
	
	private String data;
	private String targa;
	private EditText via;
	
	
	
	private boolean useGPS= true;
	private static final String GMAP_URL = "http://maps.googleapis.com/maps/api/geocode/json?latlng=";
	private double sanzione;
	
	// sezione gestione bottoni infrazioni
	private boolean[] infr = {false,false,false,false,false,false};
	
	private String codiciInfrazioni[] = {"120", "130", "330", "440", "100", "210"};
	private String testoInfrazioni[] = {"il veicolo è in divieto di sosta", "Il veicolo è passato con il rosso", "Il veicolo ha sorpassato in un tratto non consentito",
										"il veicolo ha circolato contromano", "il veicolo andava troppo veloce", "illuminazione non congrua"};
	
	ArrayList <String> infraz = new ArrayList<String>();
	ArrayList <String> cod = new ArrayList<String>();
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.multa);
        
        
        
        ToggleButton infrazione1 =(ToggleButton) findViewById(R.id.button1);
       

        
        ToggleButton infrazione2 =(ToggleButton) findViewById(R.id.button2);
        ToggleButton infrazione3 =(ToggleButton) findViewById(R.id.button3);
     
        
        ToggleButton infrazione4 =(ToggleButton) findViewById(R.id.button6);
        ToggleButton infrazione5 =(ToggleButton) findViewById(R.id.button7);
        ToggleButton infrazione6 =(ToggleButton) findViewById(R.id.button8);
        
        
        Button gps = (Button) findViewById(R.id.gps);
        Button ok = (Button) findViewById(R.id.buttonokmulta);
        tv = (TextView) findViewById(R.id.textViewcoordinate);
        targa = getIntent().getStringExtra("targa");
        via = (EditText) findViewById(R.id.viaecomuneedit);
        
        
        infrazione1.setOnClickListener(infrazione1Listener);
        infrazione2.setOnClickListener(infrazione2Listener);
        infrazione3.setOnClickListener(infrazione3Listener);
      
        infrazione4.setOnClickListener(infrazione4Listener);
        infrazione5.setOnClickListener(infrazione5Listener);
        infrazione6.setOnClickListener(infrazione6Listener);
       
       // camera.setOnClickListener(cameraListener);
        gps.setOnClickListener(gpsListener);
        ok.setOnClickListener(okListener);
        
        
        sanzione = 0;
        
        
	}
	
	protected void onRestart(){
    	super.onRestart();
    	if (VariabiliCondiviseApplication.restored){
    		
    		TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
            VariabiliCondiviseApplication.IMEI = telephonyManager.getDeviceId();
			VariabiliCondiviseApplication.online = false;
			
			CustomDialogLoginOffline dialog = new CustomDialogLoginOffline(this);
		    dialog.setCancelable(false);
		    dialog.show();
    	}
    }
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu2, menu);
        return true;
    }
	@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.icon: 
            	CustomDialogLoginOnline dialog = new CustomDialogLoginOnline(this);
            	dialog.show();
                break;
           
        }
        return true;
    }
	
	// si occupa dell'infrazione 1
	 private OnClickListener infrazione1Listener = new OnClickListener() {
        public void onClick(View v) {
        	
        	
        	if (!infr[0]){

        		infr[0]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[0]=false;
        		sanzione -= 10;
        		
        	}
        	
        	//startActivity(new Intent(MultaActivity.this, CaricaNotificaVerbaleSecureActivity.class));
        	
        }
	 };
	 private OnClickListener infrazione2Listener = new OnClickListener() {
        public void onClick(View v) {
        	if (!infr[1]){        	
        		infr[1]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[1]=false;
        		sanzione -= 10;
        		
        	}
        	
        }
	 };
	 private OnClickListener infrazione3Listener = new OnClickListener() {
        public void onClick(View v) {
        	
        	if (!infr[2]){
        		infr[2]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[2]=false;
        		sanzione -= 10;
        		
        	}
        }
	 };
	
	 private OnClickListener infrazione4Listener = new OnClickListener() {
        public void onClick(View v) {
        	
        	if (!infr[3]){
        		
        		infr[3]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[3]=false;
        		sanzione -= 10;
        		
        	}
        }
	 };
	 private OnClickListener infrazione5Listener = new OnClickListener() {
        public void onClick(View v) {
        	
        	if (!infr[4]){
        		
        		infr[4]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[4]=false;
        		sanzione -= 10;
        	}
        }
	 };
	 private OnClickListener infrazione6Listener = new OnClickListener() {
        public void onClick(View v) {
        	
        	if (!infr[5]){
        		
        		infr[5]=true;
        		sanzione += 10;
        	}
        	else{
        		
        		infr[5]=false;
        		sanzione -= 10;
        		
        	}
        }
	 };
	
	// gestisce il bottone del GPS cercando di triangolare la posizione
	 private OnClickListener gpsListener = new OnClickListener() {
        public void onClick(View v) {
        	useGPS = true;
        	tv.setText("");
        	LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        	if ( !service.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
    	        buildAlertMessageNoGps();
    	        useGPS = false;
    	    }
        	
        	if (useGPS){
	        	tv.setText("Sto cercando di ottenere la posizione");
	        	LocationProvider provider =  service.getProvider(LocationManager.GPS_PROVIDER);
	        	if(provider != null)
	        		service.requestLocationUpdates(provider.getName(), 1000, 100, listener);
	  	        	
	        	else tv.setText("nessun provider disponibile!");
        	}
        	
        	
        }
	 };
	 
	    private String inputStreamToString(InputStream is) {

	        String line = "";
	        StringBuilder total = new StringBuilder();

	        // Wrap a BufferedReader around the InputStream
	        BufferedReader rd = new BufferedReader(new InputStreamReader(is),8000);

	        try {
	            // Read response until the end
	            while ((line = rd.readLine()) != null) {
	                total.append(line);
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        }

	        // Return full string
	        return total.toString();
	    }
	 
	 // si connette ai servizi di Google per recuperare la via e l'indirizzo
	    private String giveMeStreet(String url) {	 

		     HttpClient httpclient = new DefaultHttpClient();
		     HttpResponse response = null;
		     String result="";
			 try{     	 
				    	
			   	 HttpGet httpGet = new HttpGet(url);
			   	 response = httpclient.execute(httpGet);		   	 
			   	 String jsonReceived = inputStreamToString(response.getEntity().getContent());
			   	 JSONObject json = new JSONObject(jsonReceived);
			   	 
			   	 JSONArray received = json.getJSONArray("results");
			   	 JSONObject internal_json =(JSONObject) received.get(0);
			   	 result = internal_json.getString("formatted_address");
			   	 
			   	 
		    } catch (Exception e) {
		    	e.printStackTrace();
		    }
		   
		    return result;
		}

	 
	 // quando si preme sul tasto OK. mancano i controlli sui campi
	 private OnClickListener okListener = new OnClickListener() {
        public void onClick(View v) {
        	
        	

        	GregorianCalendar time = new GregorianCalendar();
        	
          //  Calendar rightNow = Calendar.getInstance(); 
            //data = rightNow.getTime().toLocaleString();
            
        	data = getDateTimeCurrent(time);
        	
           /* if ((targa.getText().toString().equals("")) && !cameraVerify){
            	Toast toast =Toast.makeText(getApplicationContext(), "Inserire la targa o scattare una foto",Toast.LENGTH_SHORT);
            	toast.show();
            }
            else if ((via.getText().toString().equals("") || comune.getText().toString().equals("")) && !gpsVerify){
            	Toast toast =Toast.makeText(getApplicationContext(), "Inserire la via e il comune o utilizzare GPS",Toast.LENGTH_SHORT);
            	toast.show();
            }*/
            
            //else if (cameraVerify || gpsVerify){ 
            	
            	/*
            	 *  Gestire connessione con il Cloud e recuperare targa e posizione in base a quale delle due è stata attivata
            	 */
            	
            	
            //}
            
            //else{// non viene effettuata ne la foto ne presa la posizione con GPS
            	
            	if(gpsVerify){
            		String via_gmap = giveMeStreet(GMAP_URL+lat+","+longi+"&sensor=true");
            		via.setText(via_gmap);
            	}
            	
            	String infrazioni = "";
            	
            	for (int i=0; i<infr.length; i++){
            		if (infr[i]){
            			infrazioni += codiciInfrazioni[i]+ "-" + " "+ testoInfrazioni[i] +"\n";
            			infraz.add(testoInfrazioni[i]);
            			cod.add(codiciInfrazioni[i]);
            		}
            			
            	}
            	
            	Intent i = new Intent(MultaActivity.this,RiassuntoMultaActivity.class);
                i.putExtra("targa", targa);
                i.putExtra("via", via.getText().toString());          	
            	i.putExtra("data_ora", data);
            	i.putExtra("sanzione", sanzione);
            	i.putStringArrayListExtra("infraz", infraz);
            	i.putStringArrayListExtra("cod", cod);
            	i.putExtra("infrazioni", infrazioni);
            	i.putExtra("nverbale", getIntent().getStringExtra("nverbale"));
            	i.putExtra("fromDB", false);
            	i.putExtra("lat", lat);
            	i.putExtra("lon", longi);
            	
            	startActivity(i);
            //}

        }
	 };
	 
	
	// metodo utilizzato dal GPS per trovare Lat e Long
	private final LocationListener listener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            // A new location update is received.  Do something useful with it.  Update the UI with
            // the location update.
        	
        	lat = location.getLatitude();
        	longi = location.getLongitude();
    		String via_gmap = giveMeStreet(GMAP_URL+lat+","+longi+"&sensor=true");
    		via.setText(via_gmap);
        	gpsVerify = true;
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };
    
    // avvisa se il GPS non è attivo e si vuole accedere al servizio
    private void buildAlertMessageNoGps() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Il GPS non è attivo, vuoi attivarlo?")
               .setCancelable(false)
               .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(final DialogInterface dialog,final int id) {
                       startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                   }
               })
               .setNegativeButton("No", new DialogInterface.OnClickListener() {
                   public void onClick(final DialogInterface dialog, final int id) {
                        dialog.cancel();
                   }
               });
        final AlertDialog alert = builder.create();
        alert.show();
    }

	 private static String getDateTimeCurrent(GregorianCalendar current){
		 SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		 String data = format.format(current.getTime());
		 return data;
		 
	 }
	 
	 protected void onPause(){
	    	super.onPause();
	    	if (VariabiliCondiviseApplication.backClick)
	    		VariabiliCondiviseApplication.restored = false;
	    	else
	    		VariabiliCondiviseApplication.restored = true;
	    	VariabiliCondiviseApplication.backClick = false;
	    }
	 
	 // si gestisce il caso in cui viene premuto il tasto back in quanto non deve ripartire il login offline
	 @Override
	    public void onBackPressed() {
		 	super.onBackPressed();
	    	VariabiliCondiviseApplication.backClick = true;
	    	
	    }
}
